import { _decorator, Component, Node, ToggleContainer, Toggle } from 'cc';
import { PlayerStatsPanel } from '../stats/PlayerStatsPanel';
import { EntityStatsPanel } from '../stats/EntityStatsPanel';
import { LogStatsPanel } from '../stats/LogStatsPanel';
import { BattleResultPanel } from '../stats/BattleResultPanel';
import { BattleResultData } from '../../../battle/Model';
import { MessageManager, MessageType } from '../message';
import { LOG } from '../../../ConsoleLogCtrl';

const { ccclass, property } = _decorator;

/**
 * Toggle类型枚举
 * 用于标识和管理不同类型的Toggle组件
 */
export enum ToggleType {
    /** Toggle类型1 */
    Toggle1 = 'Toggle1',
    /** Toggle类型2 */
    Toggle2 = 'Toggle2',
    /** Toggle类型3 */
    Toggle3 = 'Toggle3'
}

/**
 * UI管理器
 * 负责显示战斗相关的UI元素和消息
 */
@ccclass('UIManager')
export class UIManager extends Component {
    @property(ToggleContainer)
    public tagContainer: ToggleContainer = null;

    // 界面引用
    @property(Node)
    public logPanel: Node = null;

    @property(Node)
    public playerStatsPanel: Node = null;

    @property(Node)
    public unitStatsPanel: Node = null;

    @property(BattleResultPanel)
    public battleResultPanel: BattleResultPanel = null;

    public logCtrl:LogStatsPanel = null;

    public playerStatsCtrl:PlayerStatsPanel = null;

    public unitStatsCtrl:EntityStatsPanel = null;

    public currentActivePanel: Node = null;

    private message:MessageManager = null;

    onLoad() {
        // 初始化UI元素
        this.initUI();
        this.message = MessageManager.getInstance();
        this.message.subscribe(MessageType.HIGHLIGHT_ENTITY_STATS_ITEM, (msg)=>{
            // 显示单位统计面板
            this.handleToggleSwitch(ToggleType.Toggle3, true);
            // 获取EntityStatsPanel控制器并高亮显示实体
            if (this.unitStatsCtrl) {
                this.unitStatsCtrl.onHighlightEntityStatsItem(msg.data);
            }
        }, this);
    }

    /**
     * 初始化UI元素
     */
    public initUI() {

        if(this.logPanel){
            this.logCtrl = this.logPanel.getComponent(LogStatsPanel);
        }

        if(this.playerStatsPanel){
            this.playerStatsCtrl = this.playerStatsPanel.getComponent(PlayerStatsPanel);
        }

        if(this.unitStatsPanel){
            this.unitStatsCtrl = this.unitStatsPanel.getComponent(EntityStatsPanel);
        }

        this.initToggles();
    }

    /**
     * 初始化Toggle组件事件
     */
    public initToggles(){
        if(this.tagContainer){
            let togs = this.tagContainer.toggleItems;
            togs.forEach(tog => {
                tog.node.on(Toggle.EventType.TOGGLE, (toggle: Toggle) => {
                    // 处理标签切换事件
                    this.handleToggleSwitch(toggle.node.name as ToggleType, toggle.isChecked);
                    LOG.log('Tag toggle clicked:', toggle.node.name, 'isChecked:', toggle.isChecked);
                }, this);
            })
        }
    }

    /**
     * 处理Toggle切换事件
     * @param toggleType Toggle类型
     * @param isChecked 是否选中
     */
    public handleToggleSwitch(toggleType: ToggleType, isChecked: boolean) {
        let player = this.playerStatsPanel.getComponent(PlayerStatsPanel);
        let entity = this.unitStatsPanel.getComponent(EntityStatsPanel);
        switch(toggleType){
            case ToggleType.Toggle1:
                this.toggleLogPanel(isChecked);
                this.hidePanel(this.playerStatsPanel);
                this.hidePanel(this.unitStatsPanel);
                break;
            case ToggleType.Toggle2:
                this.togglePlayerStatsPanel(isChecked);
                if (isChecked) {
                    player.showPanel();
                }
                this.hidePanel(this.logPanel);
                this.hidePanel(this.unitStatsPanel);
                break;
            case ToggleType.Toggle3:
                this.toggleUnitStatsPanel(isChecked);
                if (isChecked) {
                    entity.showPanel();
                }
                this.hidePanel(this.logPanel);
                this.hidePanel(this.playerStatsPanel);
                break;
            default:
                LOG.warn(`未知的Toggle类型: ${toggleType}`);
                break;
        }
    }

    /**
     * 切换日志面板显示状态
     * @param show 是否显示
     */
    public toggleLogPanel(show: boolean) {
        if (!this.logPanel) {
            return;
        }

        if (show) {
            this.showPanel(this.logPanel);
        } else {
            this.hidePanel(this.logPanel);
        }
    }

    /**
     * 切换玩家统计面板显示状态
     * @param show 是否显示
     */
    public togglePlayerStatsPanel(show: boolean) {
        if (!this.playerStatsPanel) {
            LOG.warn('玩家统计面板未设置');
            return;
        }

        if (show) {
            this.showPanel(this.playerStatsPanel);
            LOG.log('显示玩家统计面板');
        } else {
            this.hidePanel(this.playerStatsPanel);
            LOG.log('隐藏玩家统计面板');
        }
    }

    /**
     * 切换单位统计面板显示状态
     * @param show 是否显示
     */
    public toggleUnitStatsPanel(show: boolean) {
        if (!this.unitStatsPanel) {
            LOG.warn('单位统计面板未设置');
            return;
        }

        if (show) {
            this.showPanel(this.unitStatsPanel);
            LOG.log('显示单位统计面板');
        } else {
            this.hidePanel(this.unitStatsPanel);
            LOG.log('隐藏单位统计面板');
        }
    }

    /**
     * 显示面板
     * @param panel 要显示的面板
     */
    public showPanel(panel: Node) {
        // 如果有当前激活的面板且不是要显示的面板，先隐藏它
        if (this.currentActivePanel && this.currentActivePanel !== panel) {
            this.hidePanel(this.currentActivePanel);
        }

        panel.active = true;
        this.currentActivePanel = panel;
    }

    /**
     * 隐藏面板
     * @param panel 要隐藏的面板
     */
    public hidePanel(panel: Node) {
        panel.active = false;

        // 如果隐藏的是当前激活面板，清空引用
        if (this.currentActivePanel === panel) {
            this.currentActivePanel = null;
        }

    }

    /**
     * 获取当前激活的面板
     * @returns 当前激活的面板节点
     */
    public getCurrentActivePanel(): Node | null {
        return this.currentActivePanel;
    }

    /**
     * 隐藏所有面板
     */
    public hideAllPanels() {
        if (this.logPanel) this.hidePanel(this.logPanel);
        if (this.playerStatsPanel) this.hidePanel(this.playerStatsPanel);
        if (this.unitStatsPanel) this.hidePanel(this.unitStatsPanel);
    }

    /**
     * 显示消息
     * @param message 消息内容
     * @param type 消息类型（info, warning, error）
     */
    public showMessage(message: string, type: string = 'info') {
        this.logCtrl.showMessage(message, type)
    }

    /**
     * 清空UI管理器
     */
    public clearUIManager() {
        if(this.logCtrl){
            this.logCtrl.clearAllMessages();
        }

        if(this.playerStatsCtrl){
            this.playerStatsCtrl.clearStats();
        }

        if(this.unitStatsCtrl){
            this.unitStatsCtrl.clearStats();
        }

        if(this.battleResultPanel){
            this.battleResultPanel.hidePanel();
        }
    }

    /**
     * 设置战斗结果到玩家统计面板
     * @param battleResult 战斗结果数据
     */
    public setBattleResult(battleResult: BattleResultData) {
        if (this.playerStatsCtrl) {
            this.playerStatsCtrl.setBattleResult(battleResult);
        }
        if (this.unitStatsCtrl) {
            this.unitStatsCtrl.setBattleResult(battleResult);
        }
        if(this.battleResultPanel){
            this.battleResultPanel.node.active = true;
            this.battleResultPanel.showBattleResult(battleResult);
        }

        // 在日志面板显示战斗结束信息
        if (this.logCtrl && battleResult) {
            // 显示胜利者信息
            if (battleResult.winner) {
                this.logCtrl.showMessage(`战斗结束🏆 胜利者: <${battleResult.winner}>`, 'battle_result');
            }

            // 显示结束消息
            if (battleResult.msg) {
                this.logCtrl.showMessage(battleResult.msg, 'battle_result');
            }
        }
    }

    /**
     * 隐藏结算面板
    */
    public hideResultPanel(){
        if(this.battleResultPanel.node.active){
            this.battleResultPanel.hidePanel();
        }
    }

    /**
     * 通知重播开始
     */
    public onReplayStart() {
        if (this.playerStatsCtrl) {
            this.playerStatsCtrl.onReplayStart();
        }
        if (this.unitStatsCtrl) {
            this.unitStatsCtrl.onReplayStart();
        }
        if(this.battleResultPanel){
            this.battleResultPanel.hidePanel();
        }
    }

}